home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / MCASM.RAR / MC_ASM.EXE / WROX_ASM / CH9 / PROTECT / KEYDISK.ASM < prev   
Assembly Source File  |  1994-05-24  |  3KB  |  173 lines

  1. dosseg
  2. .model small
  3. .stack 100h
  4. .data
  5.  
  6. Track        db ?,0,01,?
  7.         db ?,0,02,?
  8.         db ?,0,03,?
  9.  
  10. DPT        db    11 dup(?)
  11.  
  12. MyName        db 'Written by Kiselyov J.V. & Malakhov K.A., Inc. ',0
  13.         db 256-48 dup (0)
  14. Prg        db 'protect_dsk',10
  15.         db 256-12 dup (0)
  16. Version        db 'Version 1.0',0
  17.         db   256-12 dup (0)
  18.  
  19. bootsec        dw 256 dup (?)
  20.  
  21. oldint1eh    dd    ?
  22.  
  23. drive        db    0
  24. new_sectsize    db    1
  25. boot_tracks    db    ?
  26.  
  27. messerr        db 'Reading Error',10,13,'$'
  28. messerr1    db 'Writing Error',10,13,'$'
  29. messerr2    db 'Formating Error',10,13,'$'
  30. messok        db 'Everything went Ok.',10,13,'$'
  31.  
  32. .code
  33.         mov    ax,@data
  34.         mov    ds,ax
  35.         mov    es,ax
  36. ; Reset controller
  37.         xor    ah,ah
  38.         int    13h
  39. ; Read BOOT sector
  40.         lea    bx,bootsec
  41.         mov    ax,0201h
  42.         mov    dl,drive
  43.         xor    dh,dh
  44.         mov    cx,1
  45.         int    13h
  46.         jnc    @@pass_010
  47.         lea    dx,messerr
  48.         jmp    @@pass_err1
  49. ; Store some parameters of disk
  50. @@pass_010:
  51.         mov    ax,word ptr es:[bx+13h]
  52.         mov    cx,word ptr es:[bx+18h]
  53.         xor    dx,dx
  54.         div    cx
  55.         mov    cx,word ptr es:[bx+1ah]
  56.         xor    dx,dx
  57.         div    cx
  58.         mov    boot_tracks,al
  59. ; Get address of disk parameter table
  60.         mov    ax,351eh
  61.         int    21h
  62. ; Store old int 1eh address
  63.         push    ds
  64.         push    ds
  65.         mov    ax,es
  66.         mov    word ptr oldint1eh+2,ax
  67.         mov    word ptr oldint1eh,bx
  68. ; Copy DPT to the buffer DPT
  69.         mov    ds,ax
  70.         pop    es
  71.         mov    si,bx
  72.         lea    di,DPT
  73.         mov    cx,11
  74.     rep    movsb
  75.         pop    ds
  76. ; Modify "sector size" field
  77.         lea    di,DPT
  78.         mov    al,new_sectsize
  79.         mov    byte ptr es:[di+3],al
  80. ; Set new DPT
  81.         lea    dx,DPT
  82.         mov    ax,251eh
  83.         int    21h
  84. ; Prepare data for format
  85.         lea    bx,Track
  86.         mov    al,boot_tracks
  87. ; Track
  88.         mov    byte ptr ds:[bx],al
  89.         mov    byte ptr ds:[bx+4],al
  90.         mov    byte ptr ds:[bx+8],al
  91. ; Sector size
  92.         mov    al,new_sectsize
  93.         mov    byte ptr ds:[bx+3],al
  94.         mov    byte ptr ds:[bx+7],al
  95.         mov    byte ptr ds:[bx+11],al
  96. ; Format last track
  97.         lea    bx,Track
  98.         mov    ah,05H
  99.         mov    al,03h
  100.         mov    cl,03h
  101.         mov    ch,boot_tracks
  102.         mov    dl,drive
  103.         xor    dh,dh
  104.         int    13h
  105.         jnc    @@pass_020
  106.         lea    dx,messerr2
  107.         jmp    @@pass_err
  108. ; Write there a specific information
  109. @@pass_020:
  110.         lea    bx,MyName
  111.         mov    cl,01h
  112.         call    WriteDisk
  113.         jnc    @@pass_030
  114.         lea    dx,messerr1
  115.         jmp    @@pass_err
  116. @@pass_030:
  117.         lea    bx,Prg
  118.         mov    cl,02h
  119.         call    WriteDisk
  120.         jnc    @@pass_040
  121.                 lea    dx,messerr1
  122.         jmp    @@pass_err
  123. @@pass_040:
  124.         lea    bx,Version
  125.         mov    cl,03h
  126.         call    WriteDisk
  127.         jnc    @@pass_050
  128.         lea    dx,messerr1
  129.         jmp    @@pass_err
  130. @@pass_050:
  131.         lea    dx,messok
  132. @@pass_err:    mov    ah,9
  133.         int    21h
  134. ; Restore previous DPT
  135.         mov    ax,word ptr oldint1eh+2
  136.         mov    dx,word ptr oldint1eh
  137.         mov    ds,ax
  138.         mov ax,251eh
  139.         int 21h
  140.         mov ax,4c00h
  141.         int 21h
  142. @@pass_err1:    mov    ah,9
  143.         int    21h
  144.         mov    ax,4c01h
  145.         int    21h
  146.  
  147. WriteDisk    proc near
  148.         push    bx
  149.         push    cx
  150. ; Write
  151.         mov    ah,03h
  152.         mov    al,01h
  153.         mov    ch,boot_tracks
  154.         mov    dl,drive
  155.         xor    dh,dh
  156.         int    13h
  157.         pop    cx
  158.         pop    bx
  159.         jnc    no_err
  160.         jmp    exitproc
  161. no_err:
  162. ; Verify
  163.         mov    ah,04h
  164.         mov    al,01h
  165.         mov    ch,boot_tracks
  166.         mov    dl,drive
  167.         xor    dh,dh
  168.         int    13h
  169. exitproc:    ret
  170. WriteDisk    endp
  171.  
  172.         end
  173.